/*
 * Copyright 2008-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.hasor.rsf.domain;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import net.hasor.core.Hasor;
import net.hasor.core.info.MetaDataAdapter;
import net.hasor.rsf.RsfBindInfo;
import net.hasor.rsf.RsfMessage;

/**
 * 服务的描述信息，包括了服务的发布和订阅信息。
 *
 * @author 赵永春(zyc@hasor.net)
 * @version : 2014年9月12日
 */

// TODO: 17/5/15 by zmyer
public class ServiceDomain<T> extends MetaDataAdapter implements RsfBindInfo<T> {
    private String bindID = null;      //服务ID
    private String bindName = null;      //服务名
    private String bindGroup = "default"; //服务分组
    private String bindVersion = "1.0.0";   //服务版本
    private Map<String, String> aliasNameMap = null;      //别名
    private Class<T> bindType = null;      //服务类型
    private boolean asMessage = false;     //是否为消息接口
    private boolean asShadow = false;     //是否为消息接口
    private boolean isSharedThreadPool = true;     //是否共享调用线程池(提供者)
    private int clientTimeout = 6000;      //调用超时（毫秒）
    private String serializeType = null;      //传输序列化类型
    private RsfServiceType serviceType = null;      //服务类型（提供者 or 消费者）

    //
    public ServiceDomain(Class<T> bindType) {
        this.bindType = bindType;
        this.asMessage = bindType.isAnnotationPresent(RsfMessage.class);
        this.aliasNameMap = new HashMap<String, String>();
    }

    public String getBindID() {
        if (bindID == null) {
            this.bindID = String.format("[%s]%s-%s", this.bindGroup, this.bindName, this.bindVersion);
        }
        return this.bindID;
    }

    /** 获取发布服务的名称。 */
    public String getBindName() {
        return this.bindName;
    }

    @Override
    public Set<String> getAliasTypes() {
        return Collections.unmodifiableSet(this.aliasNameMap.keySet());
    }

    /** 设置发布服务的名称。 */
    public void setBindName(String bindName) {
        this.bindName = bindName;
    }

    /** 获取发布服务的分组名称（默认是：default）。 */
    public String getBindGroup() {
        return this.bindGroup;
    }

    /** 设置发布服务的分组名称（默认是：default）。 */
    public void setBindGroup(String bindGroup) {
        this.bindGroup = bindGroup;
    }

    /** 获取发布服务的版本号。 */
    public String getBindVersion() {
        return this.bindVersion;
    }

    /** 设置发布服务的版本号。 */
    public void setBindVersion(String bindVersion) {
        this.bindVersion = bindVersion;
    }

    /** @return 别名 */
    public String getAliasName(String aliasType) {
        return this.aliasNameMap.get(aliasType);
    }

    /** 设置服务别名 */
    public void putAliasName(String aliasType, String aliasName) {
        aliasType = Hasor.assertIsNotNull(aliasType, "aliasType is null.");
        aliasName = Hasor.assertIsNotNull(aliasName, "aliasName is null.");
        this.aliasNameMap.put(aliasType, aliasName);
    }

    /** 服务类型 */
    public Class<T> getBindType() {
        return this.bindType;
    }

    /** 是否为消息接口。 */
    public boolean isMessage() {
        return this.asMessage || this.bindType.isAnnotationPresent(RsfMessage.class);
    }

    /** 设置接口的工作状态,如果接口标记了@RsfMessage,那么无论设置什么值 isMessage 都会返回true。 */
    public void setMessage(boolean asMessage) {
        this.asMessage = asMessage;
    }

    /** 接口是否要求工作在隐藏模式下。 */
    public boolean isShadow() {
        return asShadow;
    }

    public void setShadow(boolean asShadow) {
        this.asShadow = asShadow;
    }

    /** 获取客户端调用服务超时时间。 */
    public int getClientTimeout() {
        return this.clientTimeout;
    }

    /** 设置客户端调用服务超时时间。 */
    public void setClientTimeout(int clientTimeout) {
        this.clientTimeout = clientTimeout;
    }

    /** 获取客户端使用的对象序列化格式。 */
    public String getSerializeType() {
        return this.serializeType;
    }

    @Override
    public boolean isSharedThreadPool() {
        return this.isSharedThreadPool;
    }

    public void setSharedThreadPool(boolean sharedThreadPool) {
        this.isSharedThreadPool = sharedThreadPool;
    }

    /** 设置客户端使用的对象序列化格式。 */
    public void setSerializeType(String serializeType) {
        this.serializeType = serializeType;
    }

    /** 获取服务类型，消费者还是提供者 */
    public RsfServiceType getServiceType() {
        return serviceType;
    }

    /** 设置服务类型，消费者还是提供者 */
    public void setServiceType(RsfServiceType serviceType) {
        this.serviceType = serviceType;
    }

    //
    @Override
    public String toString() {
        return "ServiceDomain{" + "bindID='" + bindID + '\'' +//
            ", bindName='" + bindName + '\'' + //
            ", bindGroup='" + bindGroup + '\'' +//
            ", bindVersion='" + bindVersion + '\'' + //
            ", bindType=" + bindType + //
            '}';
    }
}